#pragma once

#include <string>
#include <tchar.h>

namespace MGUtils
{
	std::string WS_To_S(const std::wstring& ws);
	std::wstring S_To_WS(const std::string& s);

	std::string StringFormat(const char* fmt, ...);
	std::wstring WStringFormat(const TCHAR* fmt, ...);

	class StringConversion
	{
	public:
		StringConversion(const std::wstring& Str);
		StringConversion(const TCHAR* Str);
		StringConversion(StringConversion&& Other);
		~StringConversion();

		const char* Get();

	private:
		char* Ptr;
		int Length;
	};

	class WStringConversion
	{
	public:
		WStringConversion(const std::string& Str);
		WStringConversion(const char* Str);
		WStringConversion(WStringConversion&& Other);
		~WStringConversion();

		const TCHAR* Get();

	private:
		TCHAR* Ptr;
		int Length;
	};


}

#define WSTR_TO_STR(str) MGUtils::WS_To_S(str)
#define STR_TO_WSTR(str) MGUtils::S_To_WS(str)
#define TCHAR_TO_UTF8(str) (char*)MGUtils::StringConversion(str).Get()
#define UTF8_TO_TCHAR(str) (TCHAR*)MGUtils::WStringConversion(str).Get()
#define STRFORMAT(fmt, ...) MGUtils::StringFormat(fmt, ##__VA_ARGS__);
#define WSTRFORMAT(fmt, ...) MGUtils::WStringFormat(fmt, ##__VA_ARGS__);

